package com.zmn.oms.dubbo.interfaces.zmn.normal.order;


import com.zmn.common.dto2.ResponseDTO;
import com.zmn.oms.dubbo.dto.common.work.TrackModifyDutyTimeDIO;
import com.zmn.oms.dubbo.dto.zmn.order.*;
import com.zmn.oms.dubbo.dto.zmn.order.user.UserListOrderQueryDIO;
import com.zmn.oms.dubbo.dto.zmn.order.user.UserOrderPageDRO;
import com.zmn.oms.dubbo.dto.zmn.order.user.UserOrderQueryDIO;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 类描述： 订单 remote
 *
 * @author yule
 * @date 2020/5/11 17:13
 */
public interface ZsNormalOrderWorkRemoteService {

    /**
     * 返修单检查
     *
     * @param checkReworkOrderDIO
     * @return
     */
    ResponseDTO checkReworkOrder(CheckReworkOrderDIO checkReworkOrderDIO);

    /**
     * 获取订单信息
     *
     * @param orderId
     * @return
     */
    ResponseDTO<OrderDRO> getOrderById(Long orderId, Long workId);

    /**
     * 获取订单信息(查询从库)
     *
     * @param orderId
     * @return
     */
    ResponseDTO<OrderDRO> getOrderByIdSrcSlave(Long orderId, Long workId);

    /**
     * 根据工单号获取订单信息 包括返修 退单订单
     *
     * @param workId 工单Id
     * @return
     */
    ResponseDTO<OrderDRO> getOrderByWorkId(@NotNull Long workId);

    /**
     * 根据工单号获取订单信息
     *
     * @param workIds 工单Id
     * @return
     */
    ResponseDTO<List<OrderDRO>> listOrderByWorkIds(@NotNull List<Long> workIds);

    /**
     * 通第三方订单id查询
     *
     * @param outerId
     * @return
     */
    ResponseDTO<OrderDRO> getOrderWorkByOuterId(@NotNull String outerId);

    /**
     * 获取订单优惠券优惠金额
     *
     * @param orderIdList 一次最多查询5000条
     * @return
     */
    ResponseDTO<Integer> getCouponDiscountAmountByOrderIdList(List<Long> orderIdList);

    /**
     * 通过保修卡获取
     *
     * @param warrantyCode
     * @return
     */
    ResponseDTO<OrderDRO> getOrderByWarrantyCode(String warrantyCode);

    /**
     * 获取微信订单详情
     *
     * @param orderId
     * @return
     */
    ResponseDTO<WeixinOrderDetailDRO> getWeixinOrderDetailById(Long orderId, Long workId);

    /**
     * 通过工单id查询工单日志
     *
     * @param workId
     * @param orderId
     * @return
     */
    ResponseDTO<List<OrderLogDRO>> listOrderLogsById(@NotNull Long workId, @NotNull Long orderId);

    /**
     * 取消订单
     *
     * @param cancelOrderDIO
     * @return
     */
    ResponseDTO cancelOrder(CancelOrderDIO cancelOrderDIO);

    /**
     * 修改订单
     *
     * @param updateOrderDIO
     * @return
     */
    ResponseDTO<NewOrderDRO> updateOrder(UpdateOrderDIO updateOrderDIO);

    /**
     * 修改一口价订单为后付
     *
     * @param orderId 订单Id
     * @return
     */
    ResponseDTO<Boolean> updateFinalPriceOrderToAfterPay(Long orderId);

    /**
     * 新单
     *
     * @param newOrderDIO
     * @return
     */
    ResponseDTO<NewOrderDRO> insertOrder(NewOrderDIO newOrderDIO);

    /**
     * 查询用户的所有订单
     *
     * @param userId
     * @return
     */
    ResponseDTO<List<SimpleOrderDRO>> getMyOrderListByUserId(Long userId);


    /**
     * 查询多用户的所有订单（品牌站使用）
     *
     * @param userListOrderQueryDIO
     * @return
     */
    @ApiOperation(value = "查询多用户的所有订单（品牌站使用）", response = ResponseDTO.class)
    ResponseDTO<List<SimpleOrderDRO>> getOrderListByUserIdList(@ApiParam("查询用户订单") UserListOrderQueryDIO userListOrderQueryDIO);


    /**
     * 查询多用户的所有订单
     *
     * @param userIdList
     * @return
     */
    @ApiOperation(value = "查询多用户的所有订单", response = ResponseDTO.class)
    ResponseDTO<List<SimpleOrderDRO>> getMyOrderListByUserIdList(@NotNull(message = "用户id集合不能为空")
                                                                 @Size(min = 1, max = 100, message = "userIdList参数不能为空且个数不能超过100")
                                                                 @ApiParam(value = "用户id集合", required = true)List<Long> userIdList);

    /**
     * 根据多用户查询用户关联的订单是否存在未完成的订单及未过期的保修卡
     *
     * @param userIdList
     * @return
     */
    @ApiOperation(value = "查询多用户关联订单是否存在未完成的订单及未过期的保修卡", response = ResponseDTO.class)
    ResponseDTO<UsersOrderDoingDRO> haveOrdersDoingByUserIdList(@NotNull(message = "用户id集合不能为空")
                                                                @Size(min = 1, max = 100, message = "userIdList参数不能为空且个数不能超过100")
                                                                @ApiParam(value = "用户id集合", required = true) Set<Long> userIdList);

    /**
     * 根据自定义tab条件和多用户查询工单列表
     *
     * @param query
     * @return
     */
    ResponseDTO<List<OrderListAppDRO>> listPageOrderByTabTypeQuery(OrderTabTypeQueryDIO query);

    /**
     * 修改预约时间
     *
     * @param trackModifyDutyTimeDIO
     * @return com.zmn.common.dto2.ResponseDTO
     * @author wangxiaokun
     */
    @ApiOperation(nickname = "modifyDutyTime", value = "修改预约时间", notes = "修改预约时间")
    ResponseDTO modifyDutyTime(@ApiParam(value = "请求参数",required = true) @NotNull(message = "请求参数不能为空")TrackModifyDutyTimeDIO trackModifyDutyTimeDIO);

    /**
     * 查询查询条件获取用户的所有订单
     *
     * @param query
     * @return
     */
    ResponseDTO<UserOrderPageDRO> listPageOrderByUserId(UserOrderQueryDIO query);

    /**
     * 根据产品ID 获取这个产品 指定月份的下单量，该方法仅查微信渠道的下单量。
     * 如果不提供月份（month），则默认查当月；
     *
     * @param productId
     * @param month
     * @return
     */
    ResponseDTO<OrderCountDRO> getOrderCountByProductId(Integer productId, Date month);

    /**
     * 根据前台产品ID 获取这个前台产品 指定月份的下单量，该方法仅查微信渠道的下单量。
     * 如果不提供月份（month），则默认查当月；
     *
     * @param showProductId 前台产品Id
     * @param month         月份
     * @return
     */
    ResponseDTO<OrderCountDRO> getOrderCountByShowProductId(Integer showProductId, Date month);

    /**
     * 根据前台产品ID 获取这个前台产品 指定月份的下单量，
     * 如果不提供月份（month），则默认查当月；
     *
     * @param showProductId 前台产品Id
     * @param month         月份
     * @param shopId        店铺ID
     * @return
     */
    ResponseDTO<OrderCountDRO> getOrderCountByShowProductIdAndShopId(Integer showProductId, Date month, Integer shopId);

    /**
     * 根据前台产品ID 获取这个前台产品 指定月份的下单量，
     * 如果不提供月份（month），则默认查当月；
     *
     * @param orderCountShopDIO
     * @return
     */
    ResponseDTO<List<OrderCountShopDRO>> getOrderCountByShowProductIdAndShopId(OrderCountShopDIO orderCountShopDIO);

    /**
     * 根据指定前台二级分类，获取下单总数量
     *
     * @param orderCountQueryDIO
     * @return
     */
    ResponseDTO<Integer> getOrderCountByQuery(OrderCountQueryDIO orderCountQueryDIO);

    /**
     * 根据指定前台二级分类，获取下单总数量
     *
     * @param orderCountQueryDIO
     * @return
     */
    ResponseDTO<Map<Integer, Integer>> getOrderCountByQuery2(OrderCountQueryDIO orderCountQueryDIO);


    /**
     * 根据用户Id查询用户的订单数量及消费金额
     *
     * @param userIdList
     * @return
     */
    @ApiOperation(value = "查询用户的订单数量及消费金额", response = ResponseDTO.class)
    ResponseDTO<UserOrderInfoDRO> getUserOrderInfoByUserId(@NotNull(message = "用户id集合不能为空")
                                                           @Size(min = 1, max = 50, message = "userIdList参数不能为空且个数不能超过50")
                                                           @ApiParam(value = "用户id集合", required = true) Set<Long> userIdList);
}